package br.unesp.rc.lcpjcontacts.model.dao;

import java.io.File;

import br.unesp.rc.lcpjcontacts.constants.ApplicationConstants;
import br.unesp.rc.lcpjcontacts.exceptions.PessoaInexistenteException;
import br.unesp.rc.lcpjcontacts.model.bean.Pessoa;
import br.unesp.rc.lcpjcontacts.model.bean.Sequence;
import br.unesp.rc.lcpjcontacts.model.utils.XMLUtils;
import br.unesp.rc.lcpjcontacts.utils.FileUtils;


/**
 * A classe PessoaDAOImpl.
 */
public class PessoaDAOImpl implements PessoaDAO {

    /**
     * Adiciona nova pessoa aos contatos (cria xml de uma entrada de Pessoa).
     *
     * @param pessoa Pessoa a ser adicionada.
     * @return pessoa inserida.
     */
    public Pessoa criarOuAtualizarPessoa(Pessoa pessoa) {
        if (null == pessoa.getIdPessoa()) {
            pessoa.setIdPessoa(Sequence.nextVal());
        }

        String nomeArquivo = obterNomeArquivoPessoa(pessoa.getIdPessoa());

        FileUtils.lerOuCriarArquivo(nomeArquivo);
        XMLUtils.toXmlAndSave(pessoa, nomeArquivo);

        return pessoa;
    }

    /**
     * Obter nome arquivo pessoa.
     *
     * @param idPessoa o id pessoa
     * @return a string
     */
    private String obterNomeArquivoPessoa(Long idPessoa) {
        StringBuilder nomeArquivo = new StringBuilder();
        nomeArquivo.append(System.getProperty(ApplicationConstants.SYSTEM_PROPERTY_USER_DIR));
        nomeArquivo.append(ApplicationConstants.PREFIXO_ARQUIVO_PESSOA);
        nomeArquivo.append(idPessoa);
        nomeArquivo.append(ApplicationConstants.EXTENSAO_XML);
        return nomeArquivo.toString();
    }

    /*
     * (non-Javadoc) @see
     * br.unesp.rc.lcpjcontacts.model.dao.PessoaDAO#buscarPessoa(java.lang.Long)
     */
    /**
     * Buscar pessoa.
     *
     * @param idPessoa o id pessoa
     * @return a pessoa
     */
    public Pessoa buscarPessoa(Long idPessoa) {
        Pessoa p = null;
        String nomeArquivo = obterNomeArquivoPessoa(idPessoa);
        File arquivo = FileUtils.lerArquivo(nomeArquivo);
        if (null != arquivo) {
            p = XMLUtils.fromXml(arquivo, Pessoa.class);
        }
        return p;
    }

    /*
     * (non-Javadoc) @see
     * br.unesp.rc.lcpjcontacts.model.dao.PessoaDAO#removerPessoa(java.lang.Long)
     */
    /**
     * Remover pessoa.
     *
     * @param idPessoa o id pessoa
     * @return true, se tiver exito
     * @throws PessoaInexistenteException exception para pessoa inexistente
     */
    public boolean removerPessoa(Long idPessoa) throws PessoaInexistenteException {
        String nomeArquivo = obterNomeArquivoPessoa(idPessoa);

        if (!FileUtils.apagarArquivo(nomeArquivo)) {
            throw new PessoaInexistenteException();
        }
        return true;
    }
}
